package br.com.fogas.notafiscal.condicoes;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import br.com.fogas.database.FogasDatabase;
import br.com.fogas.database.entidade.NotaItem;
import br.com.fogas.database.entidade.NotaItemCondicoes;
import br.com.fogas.database.exception.CondicoesPrecoException;
import br.com.fogas.notafiscal.NotaFiscalUtils;

public abstract class CondicoesResponsability {

	protected CondicoesResponsability proxima;
	
	protected FogasDatabase database;
	
	protected String condicao;
	
	protected NotaItem notaItem;
	
	protected Date dataPedido;
	
	public CondicoesResponsability() { }
	
	public CondicoesResponsability(FogasDatabase database, NotaItem notaItem, String condicao, Date dataPedido) {
		this.database = database;
		this.notaItem = notaItem;
		this.condicao = condicao;
		this.dataPedido = dataPedido;
	}
	
	public void setProxima(CondicoesResponsability proxima) {
		this.proxima = proxima;
	} 
	
	public abstract BigDecimal getPreco() throws CondicoesPrecoException;
	
	public List<NotaItemCondicoes> atende(List<NotaItemCondicoes> condicoes) throws CondicoesPrecoException{
		try {
			BigDecimal valor = getPreco();
			if(valor != null) {
				NotaItemCondicoes itemCondicao = getNotaItemCondicao(condicao, valor, notaItem);
				condicoes.add(itemCondicao);
			}
			
			if(proxima != null) {
				return proxima.atende(condicoes);
			}
			
			return condicoes;
		} catch (Exception e) {
			throw new CondicoesPrecoException(e.getMessage());
		}
	}
	
	private NotaItemCondicoes getNotaItemCondicao(String condicao, BigDecimal valor, NotaItem notaItem) {
		NotaItemCondicoes itemCondicao = new NotaItemCondicoes();
		itemCondicao.setTx_condicao(condicao);
		itemCondicao.setTx_nota_item(notaItem);
		itemCondicao.setVl_total(NotaFiscalUtils.valorItemNota(valor, notaItem.getNb_qtde()));
		itemCondicao.setVl_unitario(valor);
		return itemCondicao;
	}
}
